package com.ruoyi.factorydata.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.utils.CacheSupportUtils;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.factorydata.domain.SupplierData;
import com.ruoyi.factorydata.domain.SupplierTypeData;
import com.ruoyi.factorydata.domain.dto.SupplierDataDTO;
import com.ruoyi.factorydata.domain.vo.SupplierDataVo;
import com.ruoyi.factorydata.mapper.SupplierDataMapper;
import com.ruoyi.factorydata.mapper.SupplierTypeDataMapper;
import com.ruoyi.factorydata.service.ISupplierDataService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 供应商数据Service业务层处理
 *
 * @author ruoyi
 * @date 2025-06-30
 */
@Service
public class SupplierDataServiceImpl extends ServiceImpl<SupplierDataMapper, SupplierData> implements ISupplierDataService {
    @Autowired
    private SupplierDataMapper supplierDataMapper;

    @Autowired
    private SupplierTypeDataMapper supplierTypeDataMapper;

    /**
     * 查询供应商数据
     *
     * @param id 供应商数据主键
     * @return 供应商数据
     */
    @Override
    public SupplierData selectSupplierDataById(Long id) {
        return supplierDataMapper.selectSupplierDataById(id);
    }

    /**
     * 查询供应商数据列表
     *
     * @param supplierDataDTO 供应商数据
     * @return 供应商数据
     */
    @Override
    public List<SupplierDataVo> selectSupplierDataList(SupplierDataDTO supplierDataDTO) {
        SupplierData supplierData = new SupplierData();
        BeanUtils.copyProperties(supplierDataDTO, supplierData);
        List<SupplierData> supplierDataList = supplierDataMapper.selectSupplierDataList(supplierData);
        List<SupplierDataVo> supplierDataVos = supplierDataList.stream().map(item -> {
            SupplierTypeData supplierTypeData = supplierTypeDataMapper.selectSupplierTypeDataById(item.getSupplierType());
            return SupplierDataVo.builder()
                    .id(item.getId())
                    .supplierCode(item.getSupplierCode())
                    .supplierName(item.getSupplierName())
                    .supplierType(supplierTypeData.getId())
                    .supplierTypeName(supplierTypeData.getTypeName())
                    .defaultWarehouse(item.getDefaultWarehouse())
                    .defaultWarehouseName("")
                    .region(item.getRegion())
                    .province(item.getProvince())
                    .city(item.getCity())
                    .addressDetail(item.getAddressDetail())
                    .postalCode(item.getPostalCode())
                    .supplierStatus(item.getSupplierStatus())
                    .contactName(item.getContactName())
                    .contactPhone(item.getContactPhone())
                    .department(item.getDepartment())
                    .position(item.getPosition())
                    .email(item.getEmail())
                    .qq(item.getQq())
                    .invoiceTitle(item.getInvoiceTitle())
                    .taxId(item.getTaxId())
                    .bankName(item.getBankName())
                    .bankBranch(item.getBankBranch())
                    .accountName(item.getAccountName())
                    .bankAccount(item.getBankAccount())
                    .remark(item.getRemark())
                    .createBy(item.getCreateBy())
                    .createTime(item.getCreateTime())
                    .updateTime(item.getUpdateTime())
                    .updateBy(item.getUpdateBy())
                    .build();
        }).collect(Collectors.toList());
        return supplierDataVos;
    }

    /**
     * 新增供应商数据
     *
     * @param supplierDataDTO 供应商数据
     * @return 结果
     */
    @Override
    public int insertSupplierData(SupplierDataDTO supplierDataDTO) {
        SupplierData supplierData = new SupplierData();
        supplierData.setSupplierCode(supplierDataDTO.getSupplierCode());
        supplierData.setSupplierName(supplierDataDTO.getSupplierName());
        supplierData.setSupplierType(supplierDataDTO.getSupplierType());
        supplierData.setDefaultWarehouse(supplierDataDTO.getDefaultWarehouse());
        // 处理省市区
        if (supplierDataDTO.getRegion() != null && !supplierDataDTO.getRegion().isEmpty()){
            if (supplierDataDTO.getRegion().size() == 2){
                supplierData.setProvince(supplierDataDTO.getRegion().get(0));
                supplierData.setCity(supplierDataDTO.getRegion().get(1));
            }else {
                supplierData.setProvince(supplierDataDTO.getRegion().get(0));
                supplierData.setCity(supplierDataDTO.getRegion().get(1));
                supplierData.setRegion(supplierDataDTO.getRegion().get(2));
            }
        }
        supplierData.setAddressDetail(supplierDataDTO.getAddressDetail());
        supplierData.setPostalCode(supplierDataDTO.getPostalCode());
        supplierData.setSupplierStatus(supplierDataDTO.getSupplierStatus());
        supplierData.setContactName(supplierDataDTO.getContactName());
        supplierData.setContactPhone(supplierDataDTO.getContactPhone());
        supplierData.setDepartment(supplierDataDTO.getDepartment());
        supplierData.setPosition(supplierDataDTO.getPosition());
        supplierData.setEmail(supplierDataDTO.getEmail());
        supplierData.setQq(supplierDataDTO.getQq());
        supplierData.setInvoiceTitle(supplierDataDTO.getInvoiceTitle());
        supplierData.setTaxId(supplierDataDTO.getTaxId());
        supplierData.setBankName(supplierDataDTO.getBankName());
        supplierData.setBankBranch(supplierDataDTO.getBankBranch());
        supplierData.setAccountName(supplierDataDTO.getAccountName());
        supplierData.setBankAccount(supplierDataDTO.getBankAccount());
        supplierData.setRemark(supplierDataDTO.getRemark());
        supplierData.setCreateBy(supplierDataDTO.getCreateBy());
        supplierData.setCreateTime(DateUtils.getNowDate());
            return supplierDataMapper.insertSupplierData(supplierData);
    }

    /**
     * 修改供应商数据
     *
     * @param supplierDataDTO 供应商数据
     * @return 结果
     */
    @Override
    public int updateSupplierData(SupplierDataDTO supplierDataDTO) {
        SupplierData supplierData = new SupplierData();
        supplierData.setId(supplierDataDTO.getId());
        supplierData.setSupplierCode(supplierDataDTO.getSupplierCode());
        supplierData.setSupplierName(supplierDataDTO.getSupplierName());
        supplierData.setSupplierType(supplierDataDTO.getSupplierType());
        supplierData.setDefaultWarehouse(supplierDataDTO.getDefaultWarehouse());
        // 处理省市区
        if (supplierDataDTO.getRegion() != null && !supplierDataDTO.getRegion().isEmpty()){
            if (supplierDataDTO.getRegion().size() == 2){
                supplierData.setProvince(supplierDataDTO.getRegion().get(0));
                supplierData.setCity(supplierDataDTO.getRegion().get(1));
                supplierData.setRegion("");
            }else {
                supplierData.setProvince(supplierDataDTO.getRegion().get(0));
                supplierData.setCity(supplierDataDTO.getRegion().get(1));
                supplierData.setRegion(supplierDataDTO.getRegion().get(2));
            }
        }
        supplierData.setAddressDetail(supplierDataDTO.getAddressDetail());
        supplierData.setPostalCode(supplierDataDTO.getPostalCode());
        supplierData.setSupplierStatus(supplierDataDTO.getSupplierStatus());
        supplierData.setContactName(supplierDataDTO.getContactName());
        supplierData.setContactPhone(supplierDataDTO.getContactPhone());
        supplierData.setDepartment(supplierDataDTO.getDepartment());
        supplierData.setPosition(supplierDataDTO.getPosition());
        supplierData.setEmail(supplierDataDTO.getEmail());
        supplierData.setQq(supplierDataDTO.getQq());
        supplierData.setInvoiceTitle(supplierDataDTO.getInvoiceTitle());
        supplierData.setTaxId(supplierDataDTO.getTaxId());
        supplierData.setBankName(supplierDataDTO.getBankName());
        supplierData.setBankBranch(supplierDataDTO.getBankBranch());
        supplierData.setAccountName(supplierDataDTO.getAccountName());
        supplierData.setBankAccount(supplierDataDTO.getBankAccount());
        supplierData.setRemark(supplierDataDTO.getRemark());
        supplierData.setUpdateTime(DateUtils.getNowDate());
        return supplierDataMapper.updateSupplierData(supplierData);
    }

    /**
     * 批量删除供应商数据
     *
     * @param ids 需要删除的供应商数据主键
     * @return 结果
     */
    @Override
    public int deleteSupplierDataByIds(Long[] ids) {
        int i = supplierDataMapper.deleteBatchIds(Arrays.stream(ids).collect(Collectors.toList()));
        return i;
    }

    /**
     * 删除供应商数据信息
     *
     * @param id 供应商数据主键
     * @return 结果
     */
    @Override
    public int deleteSupplierDataById(Long id) {
        return supplierDataMapper.deleteSupplierDataById(id);
    }

    @Override
    public String getSupplierNameByIdAndCache(Long supplierId, HashMap<Long, String> createByCache) {
        return CacheSupportUtils.getFromCacheOrDB(supplierId, createByCache, this::selectSupplierDataById, SupplierData::getSupplierName,false);
    }
}